﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Business.Entity.Contabil.Pessoa.SubClass.Usuario.ClassesRelacionadas;
using Business.Enum;

namespace Business.Seguranca
{
    public class SegurancaUtils
    {

        private static IList<String> FormulariosSuperAdmin = new List<string>(
            )
        {
            "ConfigBusiness", 
            "RecebeChave", 
            "Funcoes", 
            "ConfTerminal", 
            "Usuario",
            "Empresa",
            "ConfGeral"
        };

        private static IList<String> FormulariosLivres = new List<string>()
        {
            "SolicitaDadosCliente",
            "Login",
            "EspelhoMDF"
        };
        private static IList<String> FormulariosAdministrador = new List<string>()
        {
            "GerarArquivoNotaDaGente"
        }; 
        private static Dictionary<String, PermissaoForm> PermissoesFormulario { get; set; }

        private static Dictionary<String, PermissaoRelatorio> PermissoesRelatorio { get; set; }

        public static void LoadPermissoes()
        {
            if (PermissoesFormulario == null)
            {
                PermissoesFormulario = new Dictionary<string, PermissaoForm>();
            }
            if (PermissoesRelatorio == null)
            {
                PermissoesRelatorio = new Dictionary<string, PermissaoRelatorio>();
            }
            foreach (var permissaoFormulario in Utils.UsuarioAtual.PermissoesFormulario)
            {
                PermissoesFormulario.Add(permissaoFormulario.Formulario.Nome,
                    permissaoFormulario);
            }
            foreach (var permissaoRelatorio in Utils.UsuarioAtual.PermissoesRelatorio)
            {
                PermissoesRelatorio.Add(permissaoRelatorio.Relatorio.Nome,
                    permissaoRelatorio);
            }
        }

        public static bool VerificaPermissaoAcessoFormulario(string formulario)
        {

            var key = formulario.Replace("Form", "");
            PermissaoForm permissao = null;
            // Libera a tela de login da validação.
            if (FormulariosLivres.Contains(key))
            {
                return true;
            }
            if (PermissoesFormulario.ContainsKey(key) &&
                PermissoesFormulario.TryGetValue(key, out permissao))
            {
                return true;
            }
            else
            {
                MessageBox.Show("Você não tem permissão para acessar esse formulário.");
            }
            return false;
        }

        public static bool VerificaPermissaoFormulario(string formulario, TipoAcao acao)
        {
            var form = formulario.Replace("Form", "");

            // Formulários que não são sujeitos à validação de permissão.
            if (form.Equals("SolicitaDadosCliente") ||
                form.Equals("MenuFiscal"))
            {
                return true;
            }

            if (Utils.UsuarioAtual == null)
            {
                return true;
            }
            if (Utils.UsuarioAtual.TipoUsuario == TipoUsuario.SuperAdministrador)
            {
                if (FormulariosSuperAdmin.Contains(form))
                {
                    return true;
                }
                else
                {
                    MessageBox.Show("Usuarios do tipo super administrador não podem acessar esse formulário.");
                    return false;
                }

            }if (Utils.UsuarioAtual.TipoUsuario == TipoUsuario.Administrador)
            {
                if (FormulariosAdministrador.Contains(form))
                {
                    return true;
                }
            }
            PermissaoForm permissao;
            if (PermissoesFormulario.ContainsKey(form))
            {
                PermissoesFormulario.TryGetValue(form, out permissao);
                if (permissao != null && permissao.PermissaoAcesso)
                {
                    switch (acao)
                    {
                        case TipoAcao.Delete:
                            if (permissao.PermissaoDelete)
                            {
                                return true;
                            }
                            break;
                        case TipoAcao.Insert:
                            if (permissao.PermissaoInsert)
                            {
                                return true;
                            }
                            break;
                        case TipoAcao.Select:
                            if (permissao.PermissaoSelect)
                            {
                                return true;
                            }
                            break;
                        case TipoAcao.Update:
                            if (permissao.PermissaoUpdate)
                            {
                                return true;
                            }
                            break;
                    }
                }
                else
                {
                    MessageBox.Show("Usuário sem permissão para acessar o formulário.");
                }
            }
            else
            {
                MessageBox.Show("Usuário sem autorização para acessar o formulário.");
            }
            return false;
        }

        public static bool VerificaPermissaoRelatorio(string relatorio)
        {
            var key = relatorio;

            if (PermissoesRelatorio.ContainsKey(key))
            {
                PermissaoRelatorio permissao = null;
                PermissoesRelatorio.TryGetValue(key, out permissao);
                if (permissao != null && permissao.Habilitado)
                {
                    return true;
                }
                else
                {
                    MessageBox.Show("Você não tem permissão para acesar este relatório");
                    return false;
                }
            }
            else
            {
                MessageBox.Show("Você não tem permissão para acesar este relatório");
            }
            return false;
        }
        public static bool VerificaPermissaoList(string formulario)
        {
            return VerificaPermissaoFormulario(formulario.Replace("List", ""), TipoAcao.Select);
        }

        public static PermissaoForm GetPermissaoForm(string formulario)
        {
            var key = formulario.Replace("Form", "").Replace("List", "");
            PermissaoForm ret = null;
            if (PermissoesFormulario.TryGetValue(key, out ret) ||
                FormulariosSuperAdmin.Contains(key))
            {
                return ret;
            }
            else
            {
                MessageBox.Show("Tentativa de recuperar permissão não existente.\n" +
                    "Chave da permissão: " + key);
                return ret;
            }
        }
    }

    public enum TipoAcao
    {
        Select,
        Update,
        Delete,
        Insert
    }
}
